#!/usr/bin/env python3
"""
阶段3：报告生成和项目文档
基于语义分析结果生成最终的项目文档
输出：完整的项目检查清单、详细的需求追踪表等
"""

import json
import sys
from pathlib import Path
from typing import Dict, List
from datetime import datetime
import logging

logger = logging.getLogger(__name__)

class Stage3ReportGenerator:
    """报告生成器"""
    
    def __init__(self, stage2_data: Dict, output_dir: Path):
        self.stage2_data = stage2_data
        self.output_dir = Path(output_dir)
        self.output_dir.mkdir(parents=True, exist_ok=True)
        
        # PRD模板结构
        self.prd_sections = [
            "项目概述",
            "需求分析", 
            "功能规格",
            "技术要求",
            "验收标准",
            "风险评估"
        ]
    
    def process(self) -> Dict:
        """生成最终报告"""
        logger.info("阶段3：开始生成最终报告文档")
        
        # 生成项目检查清单
        checklist_file = self._generate_project_checklist()
        
        # 生成需求追踪矩阵
        traceability_file = self._generate_traceability_matrix()
        
        # 生成项目计划模板
        project_plan_file = self._generate_project_plan()
        
        # 生成测试用例模板
        test_cases_file = self._generate_test_cases()
        
        # 生成实施指南
        implementation_guide_file = self._generate_implementation_guide()
        
        result_data = {
            "generation_timestamp": datetime.now().isoformat(),
            "source_file": self.stage2_data.get("stage2_file", ""),
            "total_requirements": self.stage2_data["data"]["total_requirements"],
            "generated_files": {
                "checklist": str(checklist_file),
                "traceability_matrix": str(traceability_file),
                "project_plan": str(project_plan_file),
                "test_cases": str(test_cases_file),
                "implementation_guide": str(implementation_guide_file)
            },
            "summary": self._generate_final_summary()
        }
        
        # 保存元数据
        output_file = self.output_dir / "stage3" / "report_metadata.json"
        output_file.parent.mkdir(parents=True, exist_ok=True)
        
        with open(output_file, 'w', encoding='utf-8') as f:
            json.dump(result_data, f, ensure_ascii=False, indent=2)
        
        logger.info(f"阶段3完成：生成了{len(result_data['generated_files'])}个文档")
        return {
            "stage3_file": str(output_file),
            "data": result_data
        }
    
    def _generate_project_checklist(self) -> Path:
        """生成项目执行检查清单"""
        analysis_data = self.stage2_data["data"]
        requirements = analysis_data["requirements"]
        
        checklist_file = self.output_dir / "stage3" / "项目执行检查清单.md"
        checklist_file.parent.mkdir(parents=True, exist_ok=True)
        
        with open(checklist_file, 'w', encoding='utf-8') as f:
            f.write("# 项目执行检查清单\n\n")
            f.write(f"**生成时间**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
            f.write(f"**基于分析**: {analysis_data.get('source_file', '')}\n")
            f.write(f"**需求总数**: {len(requirements)}\n\n")
            
            # 项目准备阶段
            f.write("## 🚀 项目准备阶段\n\n")
            f.write("### 团队准备\n")
            f.write("- [ ] 项目团队成员确认\n")
            f.write("- [ ] 角色职责分配明确\n")
            f.write("- [ ] 沟通机制建立\n")
            f.write("- [ ] 开发环境搭建\n\n")
            
            f.write("### 需求确认\n")
            f.write("- [ ] 与客户确认需求理解正确\n")
            f.write("- [ ] 需求优先级达成一致\n")
            f.write("- [ ] 验收标准明确定义\n")
            f.write("- [ ] 变更管理流程确立\n\n")
            
            # 需求实现检查清单
            f.write("## 📋 需求实现清单\n\n")
            
            # 按优先级分组
            priority_groups = {"P0": [], "P1": [], "P2": [], "P3": []}
            for req in requirements:
                priority = req["priority"]
                if priority in priority_groups:
                    priority_groups[priority].append(req)
                else:
                    priority_groups["P3"].append(req)  # 默认为P3
            
            for priority in ["P0", "P1", "P2", "P3"]:
                if priority_groups[priority]:
                    f.write(f"### {priority} 高优先级需求\n\n")
                    for req in priority_groups[priority]:
                        f.write(f"- [ ] **{req['id']}**: {req['requirement_text']}\n")
                        f.write(f"  - 负责方: {req['speaker_role']}\n")
                        f.write(f"  - 类型: {req['requirement_type']}\n")
                        f.write(f"  - 预估工作量: _待评估_\n")
                        f.write(f"  - 完成时间: _待确定_\n\n")
            
            # 质量检查清单
            f.write("## ✅ 质量检查清单\n\n")
            f.write("### 开发质量\n")
            f.write("- [ ] 代码审查完成\n")
            f.write("- [ ] 单元测试通过\n")
            f.write("- [ ] 代码规范检查\n")
            f.write("- [ ] 安全漏洞扫描\n")
            f.write("- [ ] 性能测试通过\n\n")
            
            f.write("### 功能质量\n")
            f.write("- [ ] 所有功能需求已实现\n")
            f.write("- [ ] 界面设计符合要求\n")
            f.write("- [ ] 用户体验测试通过\n")
            f.write("- [ ] 异常处理完善\n")
            f.write("- [ ] 数据验证正确\n\n")
            
            f.write("### 系统质量\n")
            f.write("- [ ] 性能指标达标\n")
            f.write("- [ ] 安全要求满足\n")
            f.write("- [ ] 兼容性测试通过\n")
            f.write("- [ ] 稳定性测试通过\n")
            f.write("- [ ] 负载测试通过\n\n")
            
            # 交付检查清单
            f.write("## 📦 交付检查清单\n\n")
            f.write("### 文档交付\n")
            f.write("- [ ] 产品需求文档完整\n")
            f.write("- [ ] 技术设计文档\n")
            f.write("- [ ] 用户操作手册\n")
            f.write("- [ ] 系统管理手册\n")
            f.write("- [ ] API接口文档\n\n")
            
            f.write("### 部署交付\n")
            f.write("- [ ] 部署文档准备\n")
            f.write("- [ ] 环境配置脚本\n")
            f.write("- [ ] 数据迁移方案\n")
            f.write("- [ ] 监控告警配置\n")
            f.write("- [ ] 备份恢复方案\n\n")
            
            f.write("### 培训交付\n")
            f.write("- [ ] 用户培训材料\n")
            f.write("- [ ] 管理员培训材料\n")
            f.write("- [ ] 培训计划制定\n")
            f.write("- [ ] 培训效果评估\n\n")
            
            # 上线验收
            f.write("## 🎯 上线验收清单\n\n")
            f.write("- [ ] 生产环境部署成功\n")
            f.write("- [ ] 数据迁移完成\n")
            f.write("- [ ] 功能验收测试通过\n")
            f.write("- [ ] 性能验收测试通过\n")
            f.write("- [ ] 安全验收测试通过\n")
            f.write("- [ ] 用户验收测试通过\n")
            f.write("- [ ] 监控系统正常运行\n")
            f.write("- [ ] 客户最终确认签字\n\n")
        
        return checklist_file
    
    def _generate_traceability_matrix(self) -> Path:
        """生成需求追踪矩阵"""
        analysis_data = self.stage2_data["data"]
        requirements = analysis_data["requirements"]
        
        matrix_file = self.output_dir / "stage3" / "需求追踪矩阵.md"
        matrix_file.parent.mkdir(parents=True, exist_ok=True)
        
        with open(matrix_file, 'w', encoding='utf-8') as f:
            f.write("# 需求追踪矩阵\n\n")
            f.write(f"**生成时间**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
            f.write(f"**需求总数**: {len(requirements)}\n\n")
            
            f.write("## 需求追踪表\n\n")
            f.write("| 需求ID | 需求描述 | 类型 | 优先级 | 提出方 | 设计状态 | 开发状态 | 测试状态 | 验收状态 |\n")
            f.write("|--------|----------|------|--------|--------|----------|----------|----------|----------|\n")
            
            for req in requirements:
                f.write(f"| {req['id']} | {req['requirement_text'][:50]}... | {req['requirement_type']} | {req['priority']} | {req['speaker_role']} | 待设计 | 待开发 | 待测试 | 待验收 |\n")
            
            f.write("\n## 状态说明\n\n")
            f.write("- **设计状态**: 待设计 → 设计中 → 设计完成 → 设计评审通过\n")
            f.write("- **开发状态**: 待开发 → 开发中 → 开发完成 → 代码审查通过\n")
            f.write("- **测试状态**: 待测试 → 测试中 → 测试完成 → 测试通过\n")
            f.write("- **验收状态**: 待验收 → 验收中 → 验收完成 → 客户确认\n\n")
            
            f.write("## 按类型统计\n\n")
            type_counts = {}
            for req in requirements:
                req_type = req["requirement_type"]
                type_counts[req_type] = type_counts.get(req_type, 0) + 1
            
            for req_type, count in type_counts.items():
                f.write(f"- **{req_type}**: {count}个需求\n")
            
            f.write("\n## 按优先级统计\n\n")
            priority_counts = {}
            for req in requirements:
                priority = req["priority"]
                priority_counts[priority] = priority_counts.get(priority, 0) + 1
            
            for priority in ["P0", "P1", "P2", "P3"]:
                if priority in priority_counts:
                    f.write(f"- **{priority}**: {priority_counts[priority]}个需求\n")
        
        return matrix_file
    
    def _generate_project_plan(self) -> Path:
        """生成项目计划模板"""
        analysis_data = self.stage2_data["data"]
        requirements = analysis_data["requirements"]
        
        plan_file = self.output_dir / "stage3" / "项目计划模板.md"
        plan_file.parent.mkdir(parents=True, exist_ok=True)
        
        with open(plan_file, 'w', encoding='utf-8') as f:
            f.write("# 项目实施计划\n\n")
            f.write(f"**项目名称**: 基于需求分析的系统开发项目\n")
            f.write(f"**计划制定时间**: {datetime.now().strftime('%Y-%m-%d')}\n")
            f.write(f"**需求总数**: {len(requirements)}\n\n")
            
            # 项目概述
            f.write("## 1. 项目概述\n\n")
            summary = analysis_data["analysis_summary"]
            f.write(f"### 1.1 项目背景\n")
            f.write(f"基于会议录音分析，识别出{summary['total_requirements']}个需求，涉及{summary['identified_speakers']}个参与方。\n\n")
            
            f.write(f"### 1.2 项目目标\n")
            f.write("- 按时按质完成所有需求开发\n")
            f.write("- 确保系统稳定性和可用性\n")
            f.write("- 满足用户体验要求\n")
            f.write("- 建立完善的文档体系\n\n")
            
            # 项目范围
            f.write("## 2. 项目范围\n\n")
            f.write("### 2.1 包含的需求类型\n")
            for req_type, count in summary["requirements_by_type"].items():
                f.write(f"- {req_type}: {count}个需求\n")
            
            f.write("\n### 2.2 不包含的内容\n")
            f.write("- 后续版本的功能需求\n")
            f.write("- 第三方系统集成（需单独评估）\n")
            f.write("- 大规模数据迁移（需单独规划）\n\n")
            
            # 项目阶段
            f.write("## 3. 项目阶段规划\n\n")
            
            phases = [
                ("需求确认阶段", "1周", [
                    "与客户确认需求理解",
                    "细化模糊需求",
                    "确定验收标准",
                    "签署需求确认书"
                ]),
                ("系统设计阶段", "2周", [
                    "系统架构设计",
                    "数据库设计",
                    "接口设计",
                    "UI/UX设计"
                ]),
                ("开发实现阶段", "6-8周", [
                    "核心功能开发",
                    "接口开发",
                    "前端页面开发",
                    "单元测试编写"
                ]),
                ("测试验证阶段", "2周", [
                    "系统测试",
                    "集成测试",
                    "性能测试",
                    "用户验收测试"
                ]),
                ("部署上线阶段", "1周", [
                    "生产环境部署",
                    "数据迁移",
                    "系统配置",
                    "用户培训"
                ])
            ]
            
            for i, (phase_name, duration, tasks) in enumerate(phases, 1):
                f.write(f"### 3.{i} {phase_name} ({duration})\n")
                for task in tasks:
                    f.write(f"- {task}\n")
                f.write("\n")
            
            # 风险管理
            f.write("## 4. 风险管理\n\n")
            conflicts = analysis_data.get("requirement_conflicts", [])
            if conflicts:
                f.write("### 4.1 已识别风险\n")
                for conflict in conflicts:
                    f.write(f"- **需求冲突**: {conflict['description']}\n")
                    f.write(f"  - 影响: 可能导致开发返工\n")
                    f.write(f"  - 应对: 需求澄清会议\n\n")
            
            f.write("### 4.2 通用风险\n")
            f.write("- **技术风险**: 新技术学习成本\n")
            f.write("  - 应对: 提前技术调研和培训\n\n")
            f.write("- **进度风险**: 需求变更导致延期\n")
            f.write("  - 应对: 变更管理流程\n\n")
            f.write("- **质量风险**: 测试不充分\n")
            f.write("  - 应对: 完善测试用例和自动化测试\n\n")
            
            # 资源规划
            f.write("## 5. 资源规划\n\n")
            f.write("### 5.1 人员配置\n")
            role_counts = summary.get("requirements_by_role", {})
            f.write("- **项目经理**: 1人（全程）\n")
            
            if any("技术" in role for role in role_counts.keys()):
                f.write("- **技术负责人**: 1人（设计+开发阶段）\n")
                f.write("- **后端开发**: 2-3人（开发阶段）\n")
            
            if any("界面" in req_type for req_type in summary["requirements_by_type"].keys()):
                f.write("- **前端开发**: 1-2人（开发阶段）\n")
                f.write("- **UI设计师**: 1人（设计阶段）\n")
            
            f.write("- **测试工程师**: 1人（测试阶段）\n")
            f.write("- **运维工程师**: 1人（部署阶段）\n\n")
            
            f.write("### 5.2 环境资源\n")
            f.write("- 开发环境服务器\n")
            f.write("- 测试环境服务器\n")
            f.write("- 生产环境服务器\n")
            f.write("- 数据库服务器\n\n")
            
            # 里程碑
            f.write("## 6. 关键里程碑\n\n")
            f.write("| 里程碑 | 计划完成时间 | 交付物 | 验收标准 |\n")
            f.write("|--------|--------------|--------|----------|\n")
            f.write("| 需求确认完成 | 第1周末 | 需求确认书 | 客户签字确认 |\n")
            f.write("| 系统设计完成 | 第3周末 | 设计文档 | 技术评审通过 |\n")
            f.write("| 开发完成 | 第11周末 | 系统代码 | 功能测试通过 |\n")
            f.write("| 测试完成 | 第13周末 | 测试报告 | 所有用例通过 |\n")
            f.write("| 系统上线 | 第14周末 | 生产系统 | 客户验收通过 |\n\n")
        
        return plan_file
    
    def _generate_test_cases(self) -> Path:
        """生成测试用例模板"""
        analysis_data = self.stage2_data["data"]
        requirements = analysis_data["requirements"]
        
        test_file = self.output_dir / "stage3" / "测试用例模板.md"
        test_file.parent.mkdir(parents=True, exist_ok=True)
        
        with open(test_file, 'w', encoding='utf-8') as f:
            f.write("# 测试用例模板\n\n")
            f.write(f"**生成时间**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
            f.write(f"**基于需求**: {len(requirements)}个需求\n\n")
            
            f.write("## 测试用例设计原则\n\n")
            f.write("1. **需求覆盖**: 每个需求至少对应一个测试用例\n")
            f.write("2. **边界测试**: 包含正常、边界、异常情况\n")
            f.write("3. **用户场景**: 基于真实用户使用场景\n")
            f.write("4. **数据驱动**: 使用多种测试数据验证\n\n")
            
            # 按需求类型生成测试用例
            reqs_by_type = {}
            for req in requirements:
                req_type = req["requirement_type"]
                if req_type not in reqs_by_type:
                    reqs_by_type[req_type] = []
                reqs_by_type[req_type].append(req)
            
            test_case_id = 1
            for req_type, reqs in reqs_by_type.items():
                f.write(f"## {req_type}测试用例\n\n")
                
                for req in reqs:
                    f.write(f"### TC{test_case_id:03d}: {req['requirement_text']}\n\n")
                    f.write(f"**需求ID**: {req['id']}\n")
                    f.write(f"**测试类型**: {req_type}测试\n")
                    f.write(f"**优先级**: {req['priority']}\n")
                    f.write(f"**前置条件**: \n")
                    f.write(f"- 系统已正常启动\n")
                    f.write(f"- 用户已登录（如需要）\n\n")
                    
                    f.write("**测试步骤**:\n")
                    f.write("1. 准备测试数据\n")
                    f.write("2. 执行相关操作\n")
                    f.write("3. 验证结果\n\n")
                    
                    f.write("**预期结果**:\n")
                    f.write(f"- 功能按{req['requirement_text']}执行\n")
                    f.write("- 无错误信息显示\n")
                    f.write("- 数据正确保存/显示\n\n")
                    
                    f.write("**测试数据**:\n")
                    f.write("- 正常数据: [待补充]\n")
                    f.write("- 边界数据: [待补充]\n")
                    f.write("- 异常数据: [待补充]\n\n")
                    
                    f.write("**执行结果**: [ ] 通过 [ ] 失败\n")
                    f.write("**备注**: \n\n")
                    f.write("---\n\n")
                    
                    test_case_id += 1
            
            # 通用测试用例
            f.write("## 系统级测试用例\n\n")
            
            system_tests = [
                ("性能测试", "验证系统响应时间和并发能力"),
                ("安全测试", "验证系统安全防护能力"),
                ("兼容性测试", "验证不同浏览器和设备兼容性"),
                ("可用性测试", "验证用户体验和易用性"),
                ("稳定性测试", "验证长时间运行稳定性")
            ]
            
            for test_name, test_desc in system_tests:
                f.write(f"### {test_name}\n\n")
                f.write(f"**测试目标**: {test_desc}\n")
                f.write("**测试方法**: [待详细设计]\n")
                f.write("**验收标准**: [待确定]\n")
                f.write("**执行结果**: [ ] 通过 [ ] 失败\n\n")
        
        return test_file
    
    def _generate_implementation_guide(self) -> Path:
        """生成实施指南"""
        analysis_data = self.stage2_data["data"]
        
        guide_file = self.output_dir / "stage3" / "实施指南.md"
        guide_file.parent.mkdir(parents=True, exist_ok=True)
        
        with open(guide_file, 'w', encoding='utf-8') as f:
            f.write("# 项目实施指南\n\n")
            f.write(f"**编写时间**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
            f.write(f"**适用项目**: 基于需求分析的系统开发\n\n")
            
            f.write("## 1. 实施准备\n\n")
            f.write("### 1.1 团队组建\n")
            f.write("- 确定项目团队成员及角色分工\n")
            f.write("- 建立项目沟通机制和协作规范\n")
            f.write("- 准备开发、测试、生产环境\n")
            f.write("- 配置版本控制和项目管理工具\n\n")
            
            f.write("### 1.2 需求澄清\n")
            f.write("- 与相关方确认需求理解的准确性\n")
            f.write("- 对模糊或冲突的需求进行澄清\n")
            f.write("- 确定需求变更管理流程\n")
            f.write("- 制定详细的验收标准\n\n")
            
            f.write("## 2. 开发实施\n\n")
            f.write("### 2.1 技术架构\n")
            f.write("- 根据需求类型选择合适的技术栈\n")
            f.write("- 设计系统整体架构和模块划分\n")
            f.write("- 制定编码规范和最佳实践\n")
            f.write("- 建立持续集成和部署流程\n\n")
            
            f.write("### 2.2 开发流程\n")
            f.write("- 按优先级安排开发顺序\n")
            f.write("- 实行敏捷开发，定期交付可用版本\n")
            f.write("- 进行代码审查确保代码质量\n")
            f.write("- 编写单元测试和集成测试\n\n")
            
            f.write("## 3. 质量控制\n\n")
            f.write("### 3.1 测试策略\n")
            f.write("- 制定详细的测试计划和测试用例\n")
            f.write("- 建立自动化测试框架\n")
            f.write("- 进行充分的功能、性能、安全测试\n")
            f.write("- 组织用户验收测试\n\n")
            
            f.write("### 3.2 质量保证\n")
            f.write("- 建立代码质量检查机制\n")
            f.write("- 进行定期的安全漏洞扫描\n")
            f.write("- 监控系统性能指标\n")
            f.write("- 建立问题跟踪和解决机制\n\n")
            
            f.write("## 4. 部署上线\n\n")
            f.write("### 4.1 部署准备\n")
            f.write("- 准备生产环境和相关配置\n")
            f.write("- 制定详细的部署方案\n")
            f.write("- 准备数据迁移脚本\n")
            f.write("- 制定回滚方案\n\n")
            
            f.write("### 4.2 上线实施\n")
            f.write("- 选择合适的上线时间窗口\n")
            f.write("- 按部署方案执行上线操作\n")
            f.write("- 进行生产环境功能验证\n")
            f.write("- 监控系统运行状态\n\n")
            
            f.write("## 5. 运维保障\n\n")
            f.write("### 5.1 监控告警\n")
            f.write("- 建立系统监控和告警机制\n")
            f.write("- 设置关键指标阈值\n")
            f.write("- 建立故障处理流程\n")
            f.write("- 定期进行系统健康检查\n\n")
            
            f.write("### 5.2 文档交付\n")
            f.write("- 编写用户操作手册\n")
            f.write("- 编写系统管理员手册\n")
            f.write("- 提供API接口文档\n")
            f.write("- 制作培训材料\n\n")
            
            f.write("## 6. 成功要素\n\n")
            f.write("### 6.1 关键成功因素\n")
            f.write("- 需求理解准确，沟通充分\n")
            f.write("- 技术方案合理，架构清晰\n")
            f.write("- 开发过程规范，质量可控\n")
            f.write("- 测试充分，验收标准明确\n")
            f.write("- 团队协作良好，进度可控\n\n")
            
            f.write("### 6.2 风险防范\n")
            f.write("- 建立风险识别和应对机制\n")
            f.write("- 保持与客户的持续沟通\n")
            f.write("- 预留充分的测试和调试时间\n")
            f.write("- 建立完善的备份和恢复机制\n\n")
            
            f.write("---\n\n")
            f.write("**注意**: 本指南基于需求分析结果生成，请结合具体项目情况调整实施细节。\n")
        
        return guide_file
    
    def _generate_final_summary(self) -> Dict:
        """生成最终总结"""
        analysis_data = self.stage2_data["data"]
        summary = analysis_data["analysis_summary"]
        
        return {
            "总需求数": summary["total_requirements"],
            "参与方数": summary["identified_speakers"],
            "平均置信度": round(summary["average_confidence"], 2),
            "需求类型分布": summary["requirements_by_type"],
            "优先级分布": summary["requirements_by_priority"],
            "冲突需求数": len(analysis_data.get("requirement_conflicts", [])),
            "建议实施周期": "12-14周",
            "关键风险点": len(analysis_data.get("requirement_conflicts", []))
        }